/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package heartinjava;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author TIENDAT
 */

public class PlayServer extends Play {
    
    public PlayServer(HeartInJava m_main, KhungBanCo g) 
    {
        player = new Player[4];
        player[0] = new Player("Player1");
        player[1] = new Player("Player2");
        player[2] = new Player("Player3");
        player[3] = new Player("Player4");

        arrayId4Card = new ArrayList<Integer>();
        this.m_Main = m_main;
        this.gui = g;
    }

    @Override
    public void Update()
    {
        if(playState == KhaiBao.PLAYSTART)
        {
            chiaBai();
            SendDataCardToClient();
            System.out.println("Switch to Game Exchange !!! ");
            this.notice("Chọn 3 lá bài để đổi với người chơi khác !");
            playState = KhaiBao.PLAYEXCHANGE;
        }
        else if(playState == KhaiBao.PLAYEXCHANGE)
        {
            if (!flagDoiBai){
                this.notice("Chọn 3 lá bài để đổi với người chơi khác!");
                ReceiveExchange();
            }
            else 
            {
                this.notice("Vui lòng chờ người chơi đổi bài...");
                if (CheckExchange()) 
                {
                    TimNguoiDiDauTien();
                    m_Main.getServer().SendToAllClient("first");
                    showbutton("play card");
                    btnXuLyChung.setEnabled(false);
                    playState = KhaiBao.PLAYPLAYING;
                }
            }
        }
        else if(playState == KhaiBao.PLAYPLAYING)
        {
            if (clickLaBai!=-1)
            {
                if (currentTurn == 0){
                    ReceiveCardPlay();
                }
                clickLaBai = -1;
            }
            KiemTraDu4LaBai();
        }
        else if(playState == KhaiBao.PLAYEND){}
    }
    
    private boolean CheckExchange() 
    {
        if (flagDoiBai && m_Main.getServer().IsExchanged()) 
        {
            Integer[][] _card = new Integer[4][];
            for(int i=0; i<4;i++){
                _card[i]= new Integer[13];
            }
            player[0].getThreeCard().toArray(_card[0]);
            m_Main.getServer().getCardExchange(0).toArray(_card[1]);
            m_Main.getServer().getCardExchange(1).toArray(_card[2]);
            m_Main.getServer().getCardExchange(2).toArray(_card[3]);

            int num = numGame%4;
            if ((num)>0)
            {
                switch(num){
                    case 1:
                        for (int i=0; i<4;i++)
                        {
                            for(int j=0; j<3; j++){
                                player[(i+1)%4].nhanThemLaBai(player[i].danhRaMotLaBai(_card[i][j]));
                            }
                        }
                        break;
                    case 2:
                        for (int i=0; i<4;i++)
                        {
                            for(int j=0; j<3; j++){
                                player[(i+2)%4].nhanThemLaBai(player[i].danhRaMotLaBai(_card[i][j]));
                            }
                        }
                        break;
                    case 3:
                        for (int i=0; i<4;i++)
                        {
                            for(int j=0; j<3; j++){
                                player[i].nhanThemLaBai(player[(i+1)%4].danhRaMotLaBai(_card[(i+1)%4][j]));
                            }
                        }
                        break;
                }
            }

            for(int i=0; i<4;i++){
                player[i].sortBoBai();
            }
            SendDataCardToClient();
            btnXuLyChung.setText("play card");
            disableButton();
            hienTatCaLaBaiChay(); // moi bỏ
            return true;
        }
        return false;
    }

    //-------------------------------------------------
    //-- chia bài
    //-- khởi tạo mảng 53 lá bài 1->53
    //-- chia bài xong sortBoBai lại theo nước cờ
    //-------------------------------------------------
    private void chiaBai() 
    {
        // khoi tao mang cac quan bai gia tri ban dau la 0
        int[] ddau = new int[53];
        for (int i = 1; i < 53; i++) 
        {
            ddau[i] = 0;
        }
        
        SecureRandom numGenerate = new SecureRandom();
        int tam = numGenerate.nextInt(53);
        int p = 0;
        for (int i = 1; i < 53; i++) 
        {
            while ((tam == 0) || (ddau[tam] == 1)) 
            {
                tam = numGenerate.nextInt(53);
            }
            ddau[tam] = 1;
           
            // chia cho tung người
            try 
            {
                player[p].nhanThemLaBai(tam);
                p = (p+1)%4;
            } catch (Exception e) {
            }
            hienTatCaLaBaiChay();
            try {
                Thread.sleep(50);
            } catch (Exception e) {
            }
        }
        for(int i=0; i<4;i++)
        {
            player[i].sortBoBai();
        }
        hienTatCaLaBaiChay();
        System.out.println("Chia bài xong !!! ");
    }

    @Override
    public void HaveMessage(String msg) {
        if(playState == KhaiBao.PLAYEXCHANGE)
        {
            if (msg.startsWith("exchange")){}
        }
        else if (playState == KhaiBao.PLAYPLAYING)
        {
            if(msg.startsWith("play")){ // tin hieu cac la bai cua nguoi choi
                int vitri = Integer.parseInt(msg.split("play")[1]);
                if (msg.split("play").length > 2) 
                {
                    String card = msg.split("play")[2];
                    String[] idcard = card.split("c");

                    //player[vitri].newRound();
                    player[vitri].getListCard().clear();
                    for (int i = 1; i < idcard.length; i++) 
                    {
                        int c = Integer.parseInt(idcard[i]);
                        player[vitri].nhanThemLaBai(c);
                    }
                }
                else
                {
                   player[vitri].getListCard().clear();
                }
            }
            else if (msg.startsWith("four")){// tin hieu 4 la bai danh ra
                arrayId4Card.clear();
                if (playState==KhaiBao.PLAYPLAYING)
                {
                    if (msg.split("four").length>1)
                    {
                        String fCard = msg.split("four")[1];
                        String []idcard = fCard.split("c");
                        for(int i=1; i<idcard.length;i++)
                        {
                            int c = Integer.parseInt(idcard[i]);
                            arrayId4Card.add(c);
                        }
                    }
                    nextturn();
                    SendDataCardToClient();
                    hienTatCaLaBaiChay();                    
                }            
            }
        }
    }

    private void KiemTraDu4LaBai() 
    {        
        if (arrayId4Card.size() == 4)
        {
            System.out.println("Checking end 4 card ...");
            int winCard = KiemTra4LaBaiWin();
            for (int i=0; i< 4; i++)
            {
                if(arrayId4Card.get(i)==winCard)
                {                    
                    try {
                        firstturn = (firstturn + i) % 4;
                        player[firstturn].congDiem4LabaiDanh(arrayId4Card);
                        capNhatDiem();
                        String score = "";
                        for (int index = 0; index < 4; index++)
                        {
                            score += "score" + player[index].getScore();
                        }
                        Thread.sleep(1000);
                        m_Main.getServer().SendToAllClient(score);
                        currentTurn = firstturn;
                        if (firstturn == 0)
                        {
                            this.notice("Đến lượt bạn đi đó bạn ^^...");
                        } else {
                            this.notice("Chờ người " + (firstturn + 1) + " đánh ...");
                        }
                        break;
                    } catch (InterruptedException ex) {
                        Logger.getLogger(PlayServer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            count13Card++;
            if (count13Card>0)
            {
                flagChonCo = true;
            }
            arrayId4Card.clear();
            m_Main.getServer().SendToAllClient("turn"+firstturn);
            hienTatCaLaBaiChay();  // ko bỏ dc
            if (count13Card == 13) 
            {
                KetThucMotVanBai();
//                dem = 0;                
//                btnXuLyChung.setIcon(null);
//                btnXuLyChung.setBorderPainted(true);
//                btnXuLyChung.setContentAreaFilled(true);
//                btnXuLyChung.setFocusPainted(true);
//                btnXuLyChung.setBounds(400, 300, 100, 30);
//                
//                btnXuLyChung.setVisible(true);
//                btnXuLyChung.setEnabled(true);
//                btnXuLyChung.setText("Đổi bài");
                
                m_Main.getServer().SendToAllClient("endround");
            }
        }
    }   
}
